from fastapi import FastAPI
import redis.asyncio as aioredis  # 导入官方提供的异步 Redis 客户端

# 创建 FastAPI 应用对象
app = FastAPI()

# 全局变量：用于存储 Redis 异步连接（在应用生命周期内复用）
redis_client = None

# 应用启动事件，在服务器启动时执行一次（适合用于初始化连接）
@app.on_event("startup")
async def startup_event():
    global redis_client
    # 初始化 Redis 客户端，连接到本地 6379 端口，返回字符串响应
    redis_client = aioredis.Redis(host='localhost', port=6379, decode_responses=True)

# 应用关闭事件，在服务器关闭前执行一次（用于释放资源）
@app.on_event("shutdown")
async def shutdown_event():
    global redis_client
    # 判断 Redis 是否已连接，如果连接了则关闭
    if redis_client:
        await redis_client.aclose()

# 定义一个 GET 接口，测试异步批量写入 Redis
@app.get("/async_write_once")
async def async_write_once():
    tasks = []
    # 构建 500 个 Redis 写入任务（user_once:{i} -> value{i}）
    for i in range(500):
        tasks.append(redis_client.set(f"user_once:{i}", f"value{i}"))

    # 并发执行所有写入任务
    await asyncio.gather(*tasks)

    # 返回结果
    return {"message": "异步写入（单连接）完成"}

# 主函数入口，可直接运行该脚本：python main.py
if __name__ == "__main__":
    import uvicorn
    # 启动 uvicorn 服务器，监听本地 8000 端口
    uvicorn.run("fastapi+redis案例展示:app", host="127.0.0.1", port=8000, reload=True)
